package com.cskaoyan.javase.oop2.encapsulate._1extends._0introduction._0old;

/**
 * 继承的引入
 * 根据我们之前学过的知识，完成如下练习：
 * 分别定义一个表示人和学生的类：
 *      1.人类：有姓名属性，以及吃饭这个行为
 *      2.教师类：有姓名，教师号两个属性，同时有吃饭，教学两种行为
 *      3.学生类：有姓名，学号两个属性，同时有吃饭，学习两种行为
 *
 * 这时就需要使用继承的语法来复用类的成员
 *
 * 什么是继承呢?继承的语法是什么样的呢?
 * Java在定义一个类时
 * 可以显式地，直接让它继承另一个类，这就是Java的继承机制，其语法是：
 *
 * [访问权限修饰符] class 类名 extends 被继承的类/已经存在的某个类{}
 * 通过继承,就可以实现对类的成员的复用
 *
 * 解释:
 *      1.继承的语法使用在定义类的时候
 *      2.继承使用关键字"extends",它的意思是扩展.继承英语单词"inherit"
 *      3.以上继承语法中,我们把"被继承的类/已经存在的某个类",称之为"父类"
 *          继承父类的类,就称之为"子类"
 *      4.(重点)子类通过继承父类,会得到父类的所有成员.
 *          类中的所有成员,指的是类中的成员变量和成员方法
 *          类中成员不包括静态成员
 *          构造器不属于任何成员
 *
 *      5.(重点)子类在继承父类成员的基础上,还可以自定义属于自身的成员
 *      所以子类实际上是在父类的基础上,扩展了父类
 *      子类是一个新的,扩展了的,功能更强大的父类
 *      子类是"青出于蓝而胜于蓝"
 *      子类的功能往往比父类更强大,至少不会比父类更弱
 *
 *      Java当中的继承,本质是扩展,而不是仅仅是继承
 *      所以它使用关键字"extends"
 *
 *      6.子类继承父类,如果父类没有某个成员,那肯定继承不了,不能凭空继承
 *
 * @since 16:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        Teacher t = new Teacher();

        System.out.println(s.name);
        t.eat();

        // 子类扩展了父类
        System.out.println(t.teacherId);
        s.study();
    }
}

// 作为父类
class Person {
    String name;

    public void eat() {
        System.out.println("人要吃饭!");
    }
}

// 作为Person类的子类,复用Person类的成员
class Teacher extends Person{
    // String name;
    int teacherId;

    /*public void eat() {
        System.out.println("人要吃饭!");
    }*/

    public void teach() {
        System.out.println("老师在上课!");
    }
}

// 作为Person类的子类,复用Person类的成员
class Student extends Person {
    // String name;
    int stuId;

    /*public void eat() {
        System.out.println("人要吃饭!");
    }*/

    public void study() {
        System.out.println("学生在自习!");
    }
}